package com.free.ext.web.spring.interceptor;

import com.free.common.vo.ResultModel;
import com.free.ext.logger.FreeLogger;
import com.free.ext.logger.FreeLoggerFactory;
import com.free.utils.JsonUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * <p>
 * 功能概述:
 * </p>
 * <p>
 * 功能详述:
 * </p>
 */
public class WebExceptionInterceptor extends HandlerInterceptorAdapter {
    /*========================================================================*
     *                         Public Fields (公共属性)
     *========================================================================*/

    /*========================================================================*
     *                         Private Fields (私有属性)
     *========================================================================*/

    private static final FreeLogger LOGGER = FreeLoggerFactory.getLogger(WebExceptionInterceptor.class);

    /*========================================================================*
     *                         Construct Methods (构造方法)
     *========================================================================*/

    /*========================================================================*
     *                         Public Methods (公有方法)
     *========================================================================*/
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        if(ex != null){
            LOGGER.info("服务发生错误", ex);
            // 获取请求方式
            if (isAjaxRequest(request))
            {
                response.setContentType("application/json;charset=UTF-8");
                if(!StringUtils.isEmpty(ex.getMessage()))
                {
                    response.getOutputStream().print(JsonUtils.searlize(ResultModel.failure(null, ex.getMessage())));
                }
                else
                {
                    response.getOutputStream().print(JsonUtils.searlize(ResultModel.failure()));
                }
                response.getOutputStream().close();
            }
            else
            {
                response.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            }
        }
    }

    /*========================================================================*
     *                         Private Methods (私有方法)
     *========================================================================*/
    private boolean isAjaxRequest(HttpServletRequest request){
        String requestType = request.getHeader("X-Requested-With");
        if ("XMLHttpRequest".equals(requestType) || request.getRequestURI().toLowerCase().endsWith("ahtml") || request.getRequestURI().toLowerCase().endsWith("json"))
        {
            return true;
        }
        return false;
    }
}
